#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>

void dowork(int no)
{
    time_t curtime;
    // 得到当前系统时间
    time(&curtime);
    // 格式化时间
    char *pt = ctime(&curtime);
    // 将时间写入文件
    int fd = open("./test______.txt", O_CREAT | O_WRONLY | O_APPEND, 0664);
    write(fd, pt, strlen(pt) + 1);
    close(fd);
}

int main()
{
    pid_t pid = fork();
    if (pid > 0)
        exit(1);
    else if (pid == 0)
    {
        // 变成会长， 脱离了控制终端 守护进程
        setsid();
        // 改变进程的工作目录
        chdir("/home/jzijin");
        // 重设文件掩码
        umask(0);
        // 关闭文件描述符
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
        // 执行核心操作
        // 注册信号捕捉
        struct sigaction act;
        act.sa_flags = 0;
        act.sa_handler = dowork;
        sigemptyset(&act.sa_mask);
        // 捕捉定时器信号
        sigaction(SIGALRM, &act, NULL);
        // 创建定时器
        struct itimerval val;
        // 第一次触发定时其的时间
        val.it_value.tv_sec = 2;
        val.it_value.tv_usec = 0;
        val.it_interval.tv_sec = 1;
        val.it_interval.tv_usec = 0;
        setitimer(ITIMER_REAL, &val, NULL);

        // 保证子进程处于运行状态
        while (1)
            ;
    }
}
